import {Injectable, CanActivate, ExecutionContext, ForbiddenException} from '@nestjs/common';
import {Reflector} from '@nestjs/core';
import {Observable} from 'rxjs';
import {Roles2} from '../decorator/roles.decorator'

@Injectable()
export class AccountGuard implements CanActivate {
    constructor(private reflector: Reflector) {
    }
    canActivate(context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean> {
        // 获取方法绑定的元数据，roles;  getHeader获取处理路由的方法函数
        const roles = this.reflector.get('roles',context.getHandler())
        // 如果没设置roles，说明路由没有权限限制
        if(!roles) return true;
        // 获取当前的请求对象
        const request = context.switchToHttp().getRequest();
        // 通过方法的roles确定接口有哪些角色可以访问，通过发起请求的角色去判断
        // role通过Query参数role模拟角色，?role=roleName

        // 角色信息通常在中间件设置到req当中
        let user = request['user'];
        const result = !!roles.includes(user.role)
        if(!result) throw new ForbiddenException('您没有权限');
        return result;
    }
}

@Injectable()
export class AccountGuard2 implements CanActivate {
    constructor(private reflector: Reflector) {
    }
    canActivate(context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean> {
        // export const Roles2 = Reflector.createDecorator<string[]>()
        // 该方法获取@Roles2(['a','b'])元数据的方法
        // 引入该装饰器,通过它去获取
        const roles = this.reflector.get(Roles2,context.getHandler())
        if(!roles) return true;
        const request = context.switchToHttp().getRequest();
        let user = request['user'];
        const result = !!roles.includes(user.role)
        if(!result) throw new ForbiddenException('您没有权限');
        return result;
    }
}
